package m_channelslot

import (
	"gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
	"time"
	"wx-api/adx-bid/common"
	"wx-api/adx-bid/config"
)

type ChannelSlot struct {
	Id               bson.ObjectId `bson:"_id" json:"id,omitempty"`
	Uqid             string        `bson:"-" json:"uqid,omitempty"`
	Code             string        `bson:"code" json:"code,omitempty"`                             //唯一id
	Name             string        `bson:"name" json:"name,omitempty"`                             //名称
	DspId            string        `bson:"dsp_id" json:"dsp_id,omitempty"`                         //所属dsp
	DspName          string        `bson:"dsp_name" json:"dsp_name,omitempty"`                     //所属dsp
	AdvId            string        `bson:"adv_id" json:"adv_id,omitempty"`                         //广告位id
	MediaId          string        `bson:"media_id" json:"media_id,omitempty"`                     //媒体ID
	AdvType          string        `bson:"adv_type" json:"adv_type,omitempty"`                     //广告位类型:1信息流，2banner，3开屏，4视频，5横幅，6插屏，7暂停，8贴片，9激励视频
	Width            int           `bson:"width" json:"width,omitempty"`                           //宽
	Height           int           `bson:"height" json:"height,omitempty"`                         //高
	LimitPrice       int64         `bson:"limit_price" json:"limit_price,omitempty"`               //限制价格，低于此价格放弃广告
	Remarks          string        `bson:"remarks" json:"remarks,omitempty"`                       //备注
	SystemType       string        `bson:"system_type" json:"system_type,omitempty"`               //ANDROID  IOS    WINDOWS
	AppName          string        `bson:"app_name" json:"app_name,omitempty"`                     //应用名称
	Package          string        `bson:"package" json:"package,omitempty"`                       //包名
	AppVersion       string        `bson:"app_version" json:"app_version,omitempty"`               //应用版本号
	TemplateId       string        `bson:"template_id" json:"template_id,omitempty"`               //关联模版
	CreateTemplateId string        `bson:"create_template_id" json:"create_template_id,omitempty"` //关联模版
	ReqNum           int           `bson:"req_num" json:"req_num,omitempty"`                       //单设备请求频次
	LimitReqRate     LRate         `bson:"req_lrate" json:"req_lrate,omitempty"`                   //控量设置
	LimitPvRate      LRate         `bson:"pv_lrate" json:"pv_lrate,omitempty"`                     //控量设置
	LimitCkRate      LRate         `bson:"ck_lrate" json:"ck_lrate,omitempty"`                     //控量设置
	Flag             int           `bson:"flag" json:"flag,omitempty"`                             //1 开启 2 关闭
	Status           int           `bson:"status" json:"status,omitempty"`                         //1 正常 2 删除
	CreateTime       int64         `bson:"create_time" json:"create_time,omitempty"`               //创建时间
	UpdateTime       int64         `bson:"update_time" json:"update_time,omitempty"`               //更新时间
	Version          string        `bson:"version" json:"version,omitempty"`                       //版本号
}

type LRate struct {
	IsSet   bool        `bson:"is_set" json:"is_set"`     //是否开启
	IsYunSu bool        `bson:"is_yunsu" json:"is_yunsu"` //false快速，true匀速：默认：快速
	DNum    int64       `bson:"dnum" json:"dnum"`         //每天总量，0不限
	HNum    int64       `bson:"hnum" json:"hnum"`         //每小时总量，0不限
	HItems  []LRateItem `bson:"hitems" json:"hitems"`     //小时自定义
}
type LRateItem struct {
	Vat string `bson:"vat" json:"vat,omitempty"` //自定义项
	Num int64  `bson:"num" json:"num,omitempty"` //数量
}

func dbGet() *common.TkMongo {
	return config.MgTableChannelSlot
}

func Save(a ChannelSlot) (string, error) {
	a.Id = bson.NewObjectId()
	tmptime := time.Now().Unix()
	a.CreateTime = tmptime
	a.UpdateTime = tmptime
	a.Flag = 1
	a.Status = 1
	a.Version = config.SysVersion
	err := dbGet().Insert(a)
	return a.Id.Hex(), err
}

// 更新
func Update(a ChannelSlot) error {
	m := bson.M{
		"name":               a.Name,
		"adv_id":             a.AdvId,
		"media_id":           a.MediaId,
		"adv_type":           a.AdvType,
		"width":              a.Width,
		"height":             a.Height,
		"limit_price":        a.LimitPrice,
		"remarks":            a.Remarks,
		"system_type":        a.SystemType,
		"app_name":           a.AppName,
		"package":            a.Package,
		"app_version":        a.AppVersion,
		"create_template_id": a.CreateTemplateId,
		"req_num":            a.ReqNum,
		"update_time":        time.Now().Unix(),
	}

	return dbGet().Set(bson.M{"_id": a.Id}, m)
}

func UpdateLRate(id string, req_rate, pv_rate, ck_rate LRate) error {
	m := bson.M{
		"req_lrate":   req_rate,
		"pv_lrate":    pv_rate,
		"ck_lrate":    ck_rate,
		"update_time": time.Now().Unix(),
	}
	return dbGet().Set(bson.M{"_id": bson.ObjectIdHex(id)}, m)
}

// 更新状态
func UpdateFalg(id string, flag int) error {
	m := bson.M{
		"flag":        flag,
		"update_time": time.Now().Unix(),
	}

	return dbGet().Set(bson.M{"_id": bson.ObjectIdHex(id)}, m)
}

// 删除
func UpdateDel(id string, status int) error {
	m := bson.M{
		"status":      status,
		"update_time": time.Now().Unix(),
	}

	return dbGet().Set(bson.M{"_id": bson.ObjectIdHex(id)}, m)
}

// 获取所有
func GetAll() []ChannelSlot {
	list := []ChannelSlot{}
	_ = dbGet().All(nil, &list)
	return list
}

func GetWAll(a int64) []ChannelSlot {
	list := []ChannelSlot{}
	_ = dbGet().All(bson.M{"update_time": bson.M{"$gte": a}}, &list)
	return list
}

// 获取详情
func GetByCode(id string) (*ChannelSlot, error) {
	a := &ChannelSlot{}
	err := dbGet().FindOne(bson.M{"_id": bson.ObjectIdHex(id)}, a)
	if err != nil {
		if err == mgo.ErrNotFound {
			return nil, nil
		}
		return nil, err
	}
	return a, nil
}
func GetByCk(id, dsp_id string) (*ChannelSlot, error) {
	a := &ChannelSlot{}
	err := dbGet().FindOne(bson.M{"_id": bson.ObjectIdHex(id)}, a)
	if err != nil {
		if err == mgo.ErrNotFound {
			return nil, nil
		}
		return nil, err
	}
	return a, nil
}

// 列表，带分页
func List(id, name, dsp_id string, flag, status, pageNum, pageSize int) (*common.PageInfo, error) {
	s := bson.M{}
	if id != "" {
		s["_id"] = bson.ObjectIdHex(id)
	}
	if name != "" {
		s["name"] = bson.M{"$regex": bson.RegEx{name, "i"}}
	}
	if dsp_id != "" {
		s["dsp_id"] = dsp_id
	}
	if flag > 0 {
		s["flag"] = flag
	}
	if status > 0 {
		s["status"] = status
	}
	var list []ChannelSlot
	return dbGet().FindPageInfo(s, "", pageSize, pageNum, "-update_time", &list)
}
